import numpy as np
import matplotlib.pyplot as plt
import scipy.optimize
import scipy.misc
import scipy.integrate

# plt.xkcd()

"""
Tracer des diagrammes de Bode pour un passe-bande (ordre 2)
"""
R1 = 20 #Ohm, faire varier entre 100 et 10000
R2 = 141 #Ohm, faire varier entre 100 et 10000
R3 = 1000 #Ohm, faire varier entre 100 et 10000
L = 1e-3 #Henry
C = 0.1e-6 #Farad
omega_0 = 1/np.sqrt(L*C)
Q1 = (1/R1)*np.sqrt(L/C)
Q2 = (1/R2)*np.sqrt(L/C)
Q3 = (1/R3)*np.sqrt(L/C)

points = 1000000

omega = np.linspace(0.1, 10000000, points)
x = omega/omega_0
G1 = 20*np.log10(1/((1-x**2)**2 + (x/Q1)**2))
G2 = 20*np.log10(1/((1-x**2)**2 + (x/Q2)**2))
G3 = 20*np.log10(1/((1-x**2)**2 + (x/Q3)**2))
#Attention ! pour la phase, il faut réfléchir aux bornes
phase1 = - np.arctan(x/(Q1*(1-x**2)))
phase2 = - np.arctan(x/(Q2*(1-x**2)))
phase3 = - np.arctan(x/(Q3*(1-x**2)))
# coupure = np.zeros(points) - 3

fig, axes = plt.subplots(2)
fig.suptitle("Diagramme de Bode d'un filtre passe-bande")
#Pour le gain
axes[0].plot(omega,G1,label="Q = {}".format(Q1))
axes[0].plot(omega,G2,label="Q = {}".format("1/sqrt(2)"))
axes[0].plot(omega,G3,label="Q = {}".format(Q3))
# axes[0].plot(omega,coupure,'--')
axes[0].set_xscale('log')
axes[0].grid()
axes[0].set_ylabel("Gain")
axes[0].legend()
#Pour la phase
axes[1].plot(omega,phase1)
axes[1].plot(omega,phase2)
axes[1].plot(omega,phase3)
axes[1].set_xscale('log')
axes[1].grid()
axes[1].set_xlabel("ω, en échelle log")
axes[1].set_ylabel("Phase")
plt.show()
